package handler

import (
	Oss "bianwang/Oss/proto"
	"bianwang/web/utils"
	"context"
	"encoding/json"
	"github.com/asim/go-micro/v3"
	"github.com/beego/beego/v2/core/logs"
	"github.com/julienschmidt/httprouter"
	"net/http"
)

// UpdataByUrl 根据url地址上传文件
func UpdataByUrl(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	utils.AlyLog("Get", "根据url地址上传文件 : api/v1.0/oss/UpdataByUrl")
	/* 获取前端发送过来的数据 */
	err := r.ParseForm()
	if err != nil {
		return
	}
	key := r.Form.Get("key")
	url := r.Form.Get("url")
	if key == "" {
		http.Error(w, "缺少关键性参数key", -1)
		return
	}
	if url == "" {
		http.Error(w, "缺少关键性参数url", -1)
		return
	}
	// 创建新的句柄
	service := micro.NewService()
	// 服务初始化
	service.Init()

	// 创建获取地区的服务并且返回句柄
	client := Oss.NewOssService("go.micro.srv.Oss", service.Client())

	// 调用函数并且获得返回数据
	rsp, err := client.UpdataByUrl(context.Background(), &Oss.RequestUrl{
		Key: key,
		Url: url,
	})
	if err != nil {
		http.Error(w, err.Error(), 502)
		return
	}

	// 创建返回数据map
	response := map[string]interface{}{
		"code": rsp.Code,
		"msg":  rsp.Msg,
		"data": rsp.Data,
	}
	w.Header().Set("Content-Type", "application/json")

	// 将返回数据map发送给前端
	if err := json.NewEncoder(w).Encode(response); err != nil {
		http.Error(w, err.Error(), 503)
		return
	}
}

// UpdataByBase 根据二进制串上传文件
func UpdataByBase(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	utils.AlyLog("Get", "根据二进制串上传文件 : api/v1.0/oss/UpdataByBase")
	/* 获取前端发送过来的数据 */
	err := r.ParseForm()
	if err != nil {
		return
	}
	key := r.Form.Get("key")
	base := r.Form.Get("base")
	if key == "" {
		http.Error(w, "缺少关键性参数key", -1)
		return
	}
	if base == "" {
		http.Error(w, "缺少关键性参数base", -1)
		return
	}
	// 创建新的句柄
	service := micro.NewService()
	// 服务初始化
	service.Init()

	// 创建获取地区的服务并且返回句柄
	client := Oss.NewOssService("go.micro.srv.Oss", service.Client())

	// 调用函数并且获得返回数据
	rsp, err := client.UpdataByBase(context.Background(), &Oss.RequestBase{
		Key:  key,
		Base: []byte(base),
	})
	if err != nil {
		http.Error(w, err.Error(), 502)
		return
	}

	// 创建返回数据map
	response := map[string]interface{}{
		"code": rsp.Code,
		"msg":  rsp.Msg,
		"data": rsp.Data,
	}
	w.Header().Set("Content-Type", "application/json")

	// 将返回数据map发送给前端
	if err := json.NewEncoder(w).Encode(response); err != nil {
		http.Error(w, err.Error(), 503)
		return
	}
}

// GetData 根据key获取文件
func GetData(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	utils.AlyLog("Get", "根据key获取文件 : api/v1.0/oss/GetData")
	/* 获取前端发送过来的数据 */
	err := r.ParseForm()
	if err != nil {
		return
	}
	key := r.Form.Get("key")
	if key == "" {
		http.Error(w, "缺少关键性参数key", -1)
		return
	}
	// 创建新的句柄
	service := micro.NewService()
	// 服务初始化
	service.Init()

	client := Oss.NewOssService("go.micro.srv.Oss", service.Client())

	// 调用函数并且获得返回数据
	rsp, err := client.GetData(context.Background(), &Oss.Request{
		Key: key,
	})
	if err != nil {
		http.Error(w, err.Error(), 502)
		return
	}
	logs.Info("rsp:", rsp)

	// 创建返回数据map
	response := map[string]interface{}{
		"code": rsp.Code,
		"msg":  rsp.Msg,
		"data": rsp.Data,
	}
	w.Header().Set("Content-Type", "application/json")

	// 将返回数据map发送给前端
	if err := json.NewEncoder(w).Encode(response); err != nil {
		http.Error(w, err.Error(), 503)
		return
	}
}
